#pragma once

#include "log.hpp"
#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>
#include <unordered_map>
#include <mutex>
typedef websocketpp::server<websocketpp::config::asio> wsserver_t;// websocket服务器

/*--------------------------------在线用户管理模块-----------------------------------
作用：利用哈希表管理在线用户的长、短连接，并提供获取长、短连接的接口*/
class online_manager// 在线用户管理器
{
public:
    void enter_hall(uint64_t uid,wsserver_t::connection_ptr &conn)//1. 进入游戏大厅
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _hall.insert(std::make_pair(uid,conn));
    }

    void exit_hall(uint64_t uid)//2. 退出游戏大厅
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _hall.erase(uid);
    }

    void enter_room(uint64_t uid,wsserver_t::connection_ptr &conn)//3. 进入游戏房间
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _room.insert(std::make_pair(uid,conn));
    }
        
    void exit_room(uint64_t uid)//4. 退出游戏房间
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _room.erase(uid);
    }

    bool is_in_hall(uint64_t uid)//5. 判断是否在游戏大厅当中
    {
        std::unique_lock<std::mutex> lock(_mutex);
        if(_hall.count(uid)) return true;
        return false;
    }

    bool is_in_room(uint64_t uid)//6. 判断是否在游戏房间当中
    {
        std::unique_lock<std::mutex> lock(_mutex);
        if(_room.count(uid)) return true;
        return false;
    }

    wsserver_t::connection_ptr get_hall_connect(uint64_t uid)//7. 获取游戏大厅的长连接
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto it = _hall.find(uid);
        if(it == _hall.end())
        {
            DEBUG_LOG("获取用户id:%d的游戏大厅长连接失败！原因：该用户不在游戏大厅中！");
            return wsserver_t::connection_ptr();// 返回一个空对象
        }
        return it->second;
    }

    wsserver_t::connection_ptr get_room_connect(uint64_t uid)//8. 获取游戏房间的长连接
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto it = _room.find(uid);
        if(it == _room.end())
        {
            DEBUG_LOG("获取用户id:%d的游戏房间长连接失败！原因：该用户不在游戏房间中！");
            return wsserver_t::connection_ptr();// 返回一个空对象
        }
        return it->second;
    }
protected:
    std::unordered_map<uint64_t,wsserver_t::connection_ptr> _hall;// 管理处于游戏大厅的用户
    std::unordered_map<uint64_t,wsserver_t::connection_ptr> _room;// 管理处于游戏房间的用户
    std::mutex _mutex;//保证线程安全
};








